<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="google-site-verification" content="yaeorbXgKPwp5BDegBtAJEHYWFEFE-BViWTj74gJPrw" />
<!--  -->
<link href="/css/default.css" type="text/css" rel="stylesheet" />
<!--  -->
<script type="text/javascript" src="/js/jquery.js"></script>
<script type="text/javascript" src="/lang/en.js"></script>
<script type="text/javascript" src="/js/mac/core.min.js"></script>
<title>mac-message 消息组件</title>
<meta name="description" content="mac-message activemq jms broker 消息中间件 消息中心" />
<meta name="keywords" content="mac-message activemq jms broker 消息中间件 消息中心 消息监控" />
<script type="text/javascript">
$(function(){
	function adjust(){
		var de = document.documentElement
			, ch = de.clientHeight, cw = de.clientWidth;
		$('#body').width(cw - 16);
	}
	$(window).resize(adjust);
	adjust();
});
</script>
</head>
<body>
<div id="head">
	<a href="/en/"><img src="/css/images/logo_s.png" alt="logo" /></a>
	<div class="title">BOARSOFT.COM</div>
	<div class="right">
		<div>
			<a href="/public/lang.php?l=en">English</a>
			|
			<a href="/public/lang.php?l=cn">简体中文</a>
			|
			<a href="http://activemq.apache.org/" target="_blank">ActiveMQ</a>
			|
			<a href="https://redis.io/" target="_blank">Redis</a>
			|
			<a href="http://www.jquery.com/" target="_blank">JQuery</a>
		</div>
	</div>
</div><div id="body">
	<div class="dir">
<h1>目录</h1>
<hr/>
<ul>
	<li><a href="./index.html">基本概念</a></li>
	<ul>
		<li><a href="./index.html#queue">消息队列与发件人队列</a></li>
		<li><a href="./index.html#adapter">输入输出适配器</a></li>
		<li><a href="./index.html#finder">过滤与分拣插件</a></li>
		<li><a href="./index.html#tq">目标队列</a></li>
		<li><a href="./index.html#rq">收件人队列</a></li>
		<li><a href="./index.html#converter">消息转换器</a></li>
		<li><a href="./index.html#finder">滤与分拣插件</a></li>
		<li><a href="./index.html#ack">收件人消息签收</a></li>
	</ul>
	<li><a href="./config.html">配置项</a></li>
	<ul>
		<li><a href="./config.html">基本配置</a></li>
		<li><a href="./config.html#queues">外置队列信息配置</a></li>
		<li><a href="./config.html#amqServer">服务端ActiveMQ配置</a></li>
		<li><a href="./config.html#amqClient">客户端ActiveMQ长连接配置</a></li>
	</ul>
	<li><a href="./demo.html">用法示例</a></li>
	<ul>
		<li><a href="./demo.html#rpc">基于RPC的收发</a></li>
		<li><a href="./demo.html#amq">ActiveMQ/JMS的收发</a></li>
		<li><a href="./demo.html#adapter">输入输出适配器</a></li>
		<li><a href="./demo.html#converter">消息转换器</a></li>
		<li><a href="./demo.html#finder">过滤与分拣插件</a></li>
		<li><a href="./demo.html#shard">简单水平分片</a></li>
	</ul>
	<li><a href="./monitor.html">可视化消息监控</a></li>
	<ul>
		<li><a href="./monitor.html">功能介绍</a></li>
	</ul>
	<li><a href="./advance.html">进阶应用</a></li>
	<ul>
		<li><a href="./advance.html#ack">收件人消息签收</a></li>
		<li><a href="./advance.html#converter">自定义消息转换器</a></li>
		<li><a href="./advance.html#interceptor">ActiveMQ消息拦截与转换</a></li>
		<li><a href="./advance.html#ack">收件人消息签收</li>
		<li><a href="./advance.html#finder">过滤与分拣插件</a></li>
		<li><a href="./advnace.html#shard">使用数据库中间件</a></li>
	</ul>
</ul>	</div>
	<div class="main">
		<div id="nav">
			<div id="nav_path">
				<a href="/en/">Home</a>
				&gt;
				mac-message
			</div>
			<div id="nav_back">
				<a href="javascript:history.back()">Back</a>
				|
				<a href="/en/">UP</a> &nbsp;&nbsp;
			</div>
			<div class="clear"></div>
		</div>
<h1>mac-message 消息组件</h1>
<h2>基本概念</h2>
&nbsp;&nbsp;mac-message使用基于长连接的“推消息”方式实现，具备很高的实时消息处理能力。
<h3>消息中间件（Message Broker）</h3>
<p><img alt="图片未加载" src="/mac/message/img/overview.png" /></p>
<h3>消息监控（Message Monitor）</h3>
<p><img alt="图片未加载" src="/mac/message/img/monitor.png" /></p>
<h3>消息发送与接收流程</h3>
<p><img alt="图片未加载" src="/mac/message/img/overview1.png" /></p>
<h2><a name="adapter"></a>输入输出适配器</h2>
&nbsp;&nbsp;输入适配器通常用于扩展消息服务器的接入与接出协议，比如：编写一个Java socket服务，将收到的报文转换成消息放入消息队列。<br/>
&nbsp;&nbsp;输出适配器同理，用于将需要发送的消息以不同的渠道和协议向外发送。<br/>
&nbsp;&nbsp;输入适配器并没有接口要求，它通过引用localMsgSvc1来实现消息入队。输出适配器则需要实现MessageService接口，并作为收件人被消息中间件在本地直接引用。<br/>
&nbsp;&nbsp;由于输入输出适配器与消息broker同在一个JVM中，其效率就比通过网关方式进行协议转换和通讯要高很多。
<h2><a name="tq"></a>目标队列（Target Queue）</h2>
&nbsp;&nbsp;消息中间件在收到消息后，先检查此队列是否有配置持久化，有则先将消息持久化，再尝试将消息写入内存队列。<br/>
&nbsp;&nbsp;如果内存队列已满则放弃入队，消息仍然保留在持久化存储中不会丢失，后续再根据恢复策略将消息读出，再次尝试写入内存队列。<br/>
&nbsp;&nbsp;整个过程对于客户端来说是同步调用，中间发生异常将抛出异常到客户端
<h2><a name="rq"></a>收件人队列（Recipient Queue）</h2>
&nbsp;&nbsp;收件人队列是运行期动态创建的，在一个消息Broker实例上，一个收件人对应一个收件人队列，与该收件人的实例数无关。<br/>
&nbsp;&nbsp;向收件人发送消息成功或失败将产生事件，更新到消息对象的recipients属性上，如果有配置持久化，也会同时进行持久化。<br/>
&nbsp;&nbsp;如果该收件人被要求必达，但发送失败，则整个消息发送失败，中间件会进行重发等补偿措施。<br/>
<h2><a name="converter"></a>消息转换器（Message Converter）</h2>
&nbsp;&nbsp;消息转换器用于将基于不同协议的消息对象进行互相转换。
<h2><a name="finder"></a>过滤与分拣插件（Recipient Finder）</h2>
&nbsp;&nbsp;过滤与分拣插件用于动态确定消息的收件人。如果希望过滤此消息（忽略）此消息只需返回空即可。
<h2><a name="ack"></a>收件人消息签收</h2>
&nbsp;&nbsp;消息签收分为三种情况：
<ol>
	<li>收件人在收到消息时，返回签收消息给中间件。</li>
	<li>消息中间件在成功将消息发往收件人时返回签收消息给发件人。</li>
	<li>收件人在收到消息时，返回签收消息给发件人。</li>
</ol>
&nbsp;&nbsp;注：在完全使用ActiveMQ方式时，与ActiveMQ的用法无异。而在使用RPC方式时，由于RPC默认是同步方法调用，因此不需要额外的签收处理。因此，只有当混合使用两种方式时需要额外的配置。
	</div>
</div>
<div id="foot">
Copyright © 2011. All rights reserved&nbsp;&nbsp;蜀ICP备11014774号-1&nbsp;&nbsp;
QQ: 7213571&nbsp;&nbsp;E-mail: pyh_jerry@163.com&nbsp;&nbsp;
<!-- 
<script type="text/javascript">
var _bdhmProtocol = (("https:" == document.location.protocol) ? " https://" : " http://");
document.write(unescape("%3Cscript src='" + _bdhmProtocol + "hm.baidu.com/h.js%3Ffc0b0282216be3d16055855d8c0e72d9' type='text/javascript'%3E%3C/script%3E"));
</script>
&nbsp;&nbsp;
 -->
</div></body>
</html>
